package com.itheima.tlias84.controller;

import com.itheima.tlias84.annotation.Log;
import com.itheima.tlias84.dto.SelectAllDeptDTO;
import com.itheima.tlias84.entity.Dept;
import com.itheima.tlias84.po.InsertDeptParam;
import com.itheima.tlias84.service.DeptService;
import com.itheima.tlias84.utils.ResultUtil;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/depts")
/**
 * @RequestMapping ：请求映射
 * 其中Target注明可以用在类、方法上。 类-->提取一个controller中的重复路径
 *                              方法--> 用于定义该接口的请求方法的，但是已经被对应的GetMapping等替代了
 */
public class DeptController {
    private static final Logger log = LoggerFactory.getLogger(DeptController.class);
//    @Autowired
//    DeptMapper deptMapper;修改↓
    @Resource
    DeptService service;


    @GetMapping
//    @RequestMapping(method = RequestMethod.GET)
    public ResultUtil selectAll() {
//        List<SelectAllDeptDTO> depts = deptMapper.selectAll();修改↓
        //使用接口
        List<SelectAllDeptDTO> depts = service.selectAll();
        return ResultUtil.success(depts);
//        日期的其它展示格式@JsonFormat(pattern = "yyyy年MM月dd日 HH:mm:ss")
/*        HashMap<String, Object> map = new HashMap<>();
        map.put("code", 1);
        map.put("msg", "查询成功");
        map.put("data", depts);
        return map;*/
    }

    /**
     * get/delet 请求参数一般拼接到yrl后面
     * post/put 请求参数一般放在请求体中，且以JSON格式发送
     *
     * @return 响应数据
     * @RequestBody 作用：1、从http请求体中获取传输的数据
     * 2、把Json字符串自动转成对象
     */
    @Log
    @PostMapping
//    @RequestMapping(method = RequestMethod.POST)
    public ResultUtil insertDept(@RequestBody InsertDeptParam param) {
        log.info("读取请求体中的数据：{}", param.getName());
//        int flag = deptMapper.insertDept(dept);
        //使用接口来实现
        //controller只做参数校验，具体的实现逻辑应该放在service层
        int flag = service.insertDept(param);

        return flag == 0 ? ResultUtil.fail("新增失败") : ResultUtil.success("新增成功");
/*        HashMap<String, Object> map = new HashMap<>();
        map.put("code", flag);
        map.put("msg", "查询成功");
        map.put("data", null);
        return map;*/
    }

    /**
     * @param id
     * @return
     * @RequestParam 注解的作用：
     * 1、value/name属性：根据指定的k 获取http URL中的值
     * 2、required：可以指定是否必传参数-->如果指定必传，前端不传相应参数则报错400
     * 3、defaultValue：给参数指定默认值
     */
    @Log
    @DeleteMapping
    public ResultUtil deleteDeptById(@RequestParam("id") Integer id) {
        log.info("删除的id：{}", id);
        int flag = service.deleteById(id);
        return flag == 0 ? ResultUtil.fail() : ResultUtil.success();
    }

    /**
     * 两个get请求，路径一模一样-->请求路径/depts/{id}
     * -->http://localhost:9999/depts/5
     * 路径获取参数不方便，路径写参数必须安照参数顺序
     * -->@PathVariable 获取uri路径以/分割的参数，会自动对标，不用按顺序输入参数
     */
    @GetMapping("/{id}")
    public ResultUtil selectDeptById(@PathVariable Integer id) {
        log.info("使用PathVariable注解获取参数{}", id);
        SelectAllDeptDTO dto = service.selectDeptById(id);
        return ResultUtil.success(dto);
    }
//
//    @GetMapping("/{id}/{name}")
//    public ResultUtil selectDeptById(@PathVariable Integer id, @PathVariable String name,
//                                     HttpServletRequest request) {
//        String uri = request.getRequestURI();
//        log.info("请求路径：{}", uri);
//        String[] split = uri.split("/");
//        log.info("路径参数id：{}", split[split.length - 1]);
//
//        log.info("使用PathVariable注解获取参数{}，{}", id, name);
//        return null;
//    }
//    @GetMapping("/{id}")
//    public ResultUtil selectDeptById(HttpServletRequest request){
//        String uri = request.getRequestURI();
//        log.info("请求路径：{}",uri);
//        String[] split = uri.split("/");
//        log.info("路径参数id：{}",split[split.length-1]);
//        return null;
//    }


    /**
     * 根据id修改部门
     * 一个请求只有一个请求体-->controller只有一个参数
     */
    @Log
    @PutMapping
//    @PostMapping 已经两次出现这个错误了！！！
    public ResultUtil updateDeptById(@RequestBody Dept dept){
        log.info("修改部门名称{}",dept.getName());
        return service.updateDeptById(dept);

    }

    /**
     * 两个PUT请求，路径一模一样
     * @param list 部门列表
     */
    @Log
    @PutMapping("/addBatch")
    public ResultUtil insertDeptBatch(@RequestBody List<Dept> list){
        int flag = service.insertDeptBatch(list);
        return flag == 0 ? ResultUtil.fail("新增失败") : ResultUtil.success(flag,"新增成功");
    }

    @Log
    @DeleteMapping("/batchDelete")
    public ResultUtil batchDelete(@RequestParam("ids") List<Integer> ids){
//        获取参数的第二种方法：
//        方法参数加上：HttpServletRequest request
//        String[] values = request.getParameterValues("ids");
//        log.info("通过servlet取重复参数：{}",Arrays.toString(values));

        log.info("批量删除的id：{}",ids);
        service.batchDelete(ids);
        return ResultUtil.success();
    }


}
